home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
t_os
/
tie
/
infdmp
/
infdmp.c
next >
Wrap
Text File
|
1991-10-18
|
8KB
|
263 lines
/*
* TMENU.INF dump tool
* date ed notes
* -------------- -- -------------------------------------
* 90/08/16 01 malor 君作のものをいただいて手直し
* 90/11/06 21:05 02 .inf ファイルをパラメータで指定できるようにした
* 91/08/15 05:55 10 TIEのおまけにつけるために、ほぼ完全に書き直した
*/
#define ANSI /* ANSI-C 準拠のチェックをする */
#include "infdmp.h"
#define TRUE (1)
#define FALSE (0)
static const def_path[] = "\\TMENU.INF" ;
static const filemode[] = "rb" ;
static char *pathlist = NULL ;
static int flag_pagepause = TRUE ;
static char module_name[13] = "" ;
static char *help_msg[] =
{
"",
" << infdmp >> -- TownsMENU L30 のアイテムファイルの内容を表示する",
"",
" usage: infdmp [opt] [パラメータ] [opt]",
"",
" param: アイテムファイルのパスリストを指定します(複数指定可)",
" フルパス指定された場合はそのファイルを表示し、ドライブ名のみ、",
" もしくはディレクトリ名まで指定されたときは、そのディレクトリの",
" TMENU.INF を表示します",
" また、ファイル名を指定するとき拡張子(.INF)は省略できます",
" パラメータが与えられなかった場合は、カレントドライブのルートに"
" ある TMENU.INF を表示します",
"",
" opt: -p ページポーズ動作をおこなう(デフォルト)",
" -n ページポーズ動作をおこなわない",
NULL
} ;
extern void inkey( char *message ) ;
extern void dmpinf( FILE *fp ) ;
extern FILE *fileopen( char *path, char *mode ) ;
int main( int argc, char **argv )
{
char *p ;
int i, files = 0 ;
/* 自分のパス名を格納 */
if( ( p = strrchr( argv[0], '\\' ) ) != NULL ) /* 階層の下のほう */
strncpy( module_name, p+1, 12 ) ;
else if( ( p = strrchr( argv[0], ':' ) ) != NULL ) /* ドライブ名付き */
strncpy( module_name, p+1, 12 ) ;
else
strncpy( module_name, argv[0], 12 ) ;
module_name[12] = '\0' ;
/* パラメータとオプションの解釈 */
for( i = 1 ; i < argc ; i ++ )
{
if( *( p = argv[i] ) == '/' || *p == '-' )
{
while( *++p != '\0' )
switch( tolower( *p ) )
{
default:
case '?': case 'h': /* ヘルプ */
for( i = 0 ; help_msg[i] ; i ++ )
printf( "%s\n", help_msg[i] ) ;
if( *p != '?' && *p != 'h' && *p != 'H' )
printf( "\n\a%s: オプションが間違っています"
" (-%c)\n", module_name, *p ) ;
return 0 ;
case 'p': /* ページポーズ動作する */
flag_pagepause = TRUE ;
break ;
case 'n': /* ページポーズ動作しない */
flag_pagepause = FALSE ;
break ;
}
}
else
files ++ ;
}
/* メイン処理 */
if( files > 0 ) /* 複数パラメータ指定 */
{
for( i = 1 ; i < argc ; i ++ )
{
if( *( p = argv[i] ) == '-' || *p == '/' ) /* オプション */
continue ;
pathlist = p ;
dmpinf( fileopen( p, (char *)filemode ) ) ;
}
}
else /* パラメータなし */
{
pathlist = (char *)def_path ;
dmpinf( fopen( (char *)def_path, (char *)filemode ) ) ;
}
}
static FILE *fileopen( char *path, char *mode )
{
auto FILE *fp ;
static char buf[256] = "" ;
switch( *(path+strlen( path )-1) )
{
case '\\': /* ディレクトリまでの指定であることが明白 */
case ':': /* ドライブ名までの指定であることが明白 */
strcpy( buf, path ) ;
strcat( buf, "TMENU.INF" ) ;
path = buf ;
break ;
}
if( ( fp = fopen( path, mode ) ) == NULL )
{
if( strlen( buf ) == 0 )
{
strcpy( buf, path ) ;
strcat( buf, ".INF" ) ; /* 拡張子のみ追加してみる */
if( ( fp = fopen( buf, mode ) ) != NULL )
path = buf ;
else
{
strcpy( buf, path ) ;
strcat( buf, (char *)def_path ) ;
if( ( fp = fopen( buf, mode ) ) != NULL )
path = buf ;
}
}
}
pathlist = path ;
return fp ;
}
static void dmpinf( FILE *fp )
{
int ln ;
int max_cmdlen, max_paralen, len ;
char *p ;
infrec tmpbuf ;
INF root, *last, *ip ;
last = &root ;
last->next = NULL ;
/* タイトル表示 */
printf( "\x0C\t\t*** TMENU.INF dump [%s] ***\n\n", pathlist ) ;
/* ファイルはみつかったのかな? */
if( fp == NULL )
{
printf( "%s: can't open '%s'\n", module_name, pathlist ) ;
exit( 2 ) ;
}
/* 読み込む */
max_cmdlen = max_paralen = 0 ;
while( fread( &tmpbuf, 1, INFBUFSIZ, fp ) != 0 )
{
/* データ格納領域を獲得する */
if( ( ip = (INF *)malloc( sizeof( INF ) ) ) == NULL )
{
printf( "%s: can't allocate memory\n", module_name ) ;
exit( 2 ) ;
}
last->next = ip ;
last = ip ;
last->next = NULL ;
/* 必ず終端子が存在するようにする */
tmpbuf.dummy = '\0' ;
/* コマンドをパスリストとパラメータに分解 */
if( ( p = strchr( (char *)tmpbuf.cmd, ' ' ) ) != NULL )
{ /* パラメータあり */
*p++ = '\0' ;
strcpy( (char *)ip->prm, p ) ;
}
else /* パラメータなし */
ip->prm[0] = '\0' ;
strcpy( (char *)ip->cmd, (char *)tmpbuf.cmd ) ;
if( ( len = strlen( (char *)ip->cmd ) ) > max_cmdlen )
max_cmdlen = len ;
if( ( len = strlen( (char *)ip->prm ) ) > max_paralen )
max_paralen = len ;
/* 必要なデータだけをコピー */
strncpy( (char *)ip->name, (char *)tmpbuf.name, 12 ) ;
ip->name[12] = '\0' ;
ip->icon_num = tmpbuf.icon_num ;
}
if( !feof( fp ) && ferror( fp ) ) /* EOF以外のエラーが発生した場合 */
{
printf( "%s: 読み込み時になんらかのエラーが発生しました "
"(ERROR #%03d)\n", module_name, errno ) ;
exit( 2 ) ;
}
fclose( fp ) ;
/* データがあることを確認して、項目名を表示 */
if( root.next == NULL )
printf( ">>> アイテムが登録されていません <<<\n" ) ;
else
{
printf( "-icon - 名 称 - " ) ;
printf( "%-*s", max_cmdlen, "- 起動コマンド -" ) ;
printf( " - パラメータ -\n" ) ;
}
/* 内容表示 */
for( ln = 2, ip = root.next ; ip != NULL ; ip = ip->next, ln ++ )
{
len = printf( "[%03d] %-12s ", ip->icon_num, ip->name ) ;
len += printf( "%-*s", max_cmdlen, ip->cmd ) ;
if( strlen( (char *)ip->prm ) > 0 )
{
if( len + strlen( (char *)ip->prm ) > 75 )
printf( "\n%19s", " " ), ln ++ ;
printf( " [%s]", ip->prm ) ;
}
putchar( '\n' ) ;
if( ln > 20 && flag_pagepause == TRUE )
{
inkey( "-- more --" ) ;
ln = 0 ;
}
}
}
static void inkey( char *msg )
{
printf( msg ) ;
fflush( stdout ) ;
getch() ;
putchar( '\n' ) ;
}